package 代码块的使用;

/*
    代码块(初始化块):
        1、代码块的作用: 用于初始化类、对象
        2、代码块如果需要修饰,则只能使用static
        3、代码块分为静态代码块和非静态代码块

    静态代码块和非静态代码块
        静态代码块:
            内部可以有输出语句
            随着类的加载而执行,且只会执行一次
            如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行
            静态代码块的执行优先于非静态代码块
            静态代码块只能调整静态的属性、静态的方法,不能调用非静态结构
            作用:
                初始化类的信息
        非静态代码块:
            内部可以有输出语句
            随着对象的创建而执行,每创建一个对象就执行一次
            如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行
            非静态代码块内可以调用静态的属性、静态的方法、非静态的属性、非静态的方法
            作用:
                可以在创建对象时,对对象的属性等进行初始化

    对属性可以赋值的位置
        1、默认初始化
        2、显式初始化
        3、构造器中初始化
        4、有了对象以后,可以通过"对象.属性"或"对象.方法"的方式进行赋值
        5、在代码块中赋值
 */
public class BlockTest {

    public static void main(String[] args) {
        String str = Person.desc;

        Person person1 = new Person();
        Person person2 = new Person();
        System.out.println(person1.getAge());
        System.out.println(Person.desc);
    }

}

class Person{
    private String name;
    private Integer age;
    public static String desc = "静态描述";

    //非静态代码块
    {
        this.age = 1;
        System.out.println("非静态代码块");
    }

    //静态代码块
    static{
        Person.desc = "静态代码块赋值";
        System.out.println("静态代码块-1");
    }

    static{
        System.out.println("静态代码块-2");
    }


    public Person(){

    }

    public Person(String name, Integer age, String desc) {
        this.name = name;
        this.age = age;
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public void eat(){
        System.out.println("非静态方法调用");
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
